import axios, { type AxiosRequestConfig, type AxiosInstance, type AxiosResponse } from 'axios'
import { type InternalAxiosRequestConfig } from 'axios';
import { ElMessage } from 'element-plus'

// 创建axios实例
const http: AxiosInstance = axios.create({
  baseURL: "",  // 使用空字符串，让请求使用相对路径，通过Vite代理转发
  timeout: 10000,
  withCredentials: true // 允许携带跨域cookie
})

// axios请求拦截器
http.interceptors.request.use((config: InternalAxiosRequestConfig) => {
  // 从Pinia持久化存储中获取token
  let token = ''
  try {
    // 从localStorage获取auth数据 - Pinia persist默认使用localStorage
    const authData = localStorage.getItem('auth')
    if (authData) {
      const parsedData = JSON.parse(authData)
      // Pinia持久化后的结构是 { state: { token: 'xxx', ... } }
      if (parsedData.state && parsedData.state.token) {
        token = parsedData.state.token
      } else if (parsedData.token) {
        // 兼容直接存储token的情况
        token = parsedData.token
      }
    }
  } catch (error) {
    console.error('从localStorage获取token失败', error)
  }

  // 如果localStorage中没有找到token，尝试从sessionStorage获取
  if (!token) {
    try {
      const authData = sessionStorage.getItem('auth')
      if (authData) {
        const parsedData = JSON.parse(authData)
        if (parsedData.state && parsedData.state.token) {
          token = parsedData.state.token
        } else if (parsedData.token) {
          token = parsedData.token
        }
      }
    } catch (error) {
      console.error('从sessionStorage获取token失败', error)
    }
  }

  // 如果有token，添加到请求头
  if (token && typeof token === 'string' && token.trim() !== '') {
    config.headers.Authorization = `${token}`
    console.log('请求已添加token:', token)
  } else {
    console.warn('请求未携带token或token无效')
  }

  // 确保请求包含正确的Content-Type和Accept头
  if (config.method?.toUpperCase() === 'POST' || config.method?.toUpperCase() === 'PUT') {
    if (!config.headers['Content-Type']) {
      config.headers['Content-Type'] = 'application/json'
    }
  }

  // 添加Accept头，确保API返回JSON格式数据
  config.headers['Accept'] = 'application/json'

  return config
}, (e) => Promise.reject(e))

// axios响应拦截器
http.interceptors.response.use((res: AxiosResponse) => res.data, (e) => {
  // 处理网络错误
  if (e.message.includes('Network Error')) {
    ElMessage.error('网络连接失败，请检查您的网络连接或服务器是否正常运行')
  } else if (e.response) {
    // 服务器返回了错误状态码
    const status = e.response.status
    if (status === 401) {
      ElMessage.error('未授权，请重新登录')

      // 清除token并跳转到登录页
      try {
        localStorage.removeItem('auth')
        sessionStorage.removeItem('auth')

        // 使用window.location.href强制刷新页面并跳转到登录页
        // 这样可以确保在API请求路径下也能正确跳转
        window.location.href = '/login'
      } catch (error) {
        console.error('清除token失败', error)
      }
    } else if (status === 403) {
      ElMessage.error('没有权限访问该资源')
    } else if (status === 404) {
      ElMessage.error('请求的资源不存在')
    } else if (status === 500) {
      ElMessage.error('服务器内部错误')
    } else {
      ElMessage.error(e.response.data?.message || `请求失败(${status})`)
    }
  } else {
    ElMessage.error(e.message || '发生未知错误')
  }
  return Promise.reject(e)
})

export default http
